package main

import (
	"fmt"
	"sync"
	"time"
)

//map映射
//map管理上亿的数据，瞬间查找
//多线程需要维护线程安全

type SyncMap struct {
	mapData map[string]string
}

var sy sync.RWMutex
var smap SyncMap   //公有的访问map
var done chan bool //通道，是否完成

func write1() {
	keys := []string{"1", "2", "3"}

	for _, k := range keys {
		sy.Lock()
		// fmt.Println(k)

		smap.mapData[k] = k

		sy.Unlock()
		time.Sleep(1 * time.Second)
	}
	done <- true
}

func write2() {
	keys := []string{"a1", "b2", "c3"}

	for _, k := range keys {
		sy.Lock()
		//fmt.Println(k)
		smap.mapData[k] = k
		sy.Unlock()
		time.Sleep(1 * time.Second)
	}
	done <- true
}

func readMap() {
	sy.RLock()
	fmt.Println("readLock")
	/**
	for k, v := range smap.mapData {
		fmt.Println(k, v)
	}
	*/

	fmt.Println(smap)
	sy.RUnlock()

}

func main() {
	smap = SyncMap{make(map[string]string)} // 这里不能重新赋值  := 这里的赋值  让我耗时两天晚上 都没有解决，重新写了个。
	done = make(chan bool, 2)

	// fmt.Println(len(done))

	go write1()
	go write2()

	for {
		readMap()

		if len(done) == 2 {

			/**
				for k, v := range smap.mapData {
					fmt.Println(k, v)
				}
			**/

			fmt.Println(smap)

			break
		} else {
			time.Sleep(1 * time.Second)
		}
	}
}
